﻿namespace Digitalmes.Application.Common.Models;

public static class ResultExtensions
{
    /// <summary>
    /// 解析 <see cref="IResult{T}"/> 并映射到 <see cref="IApiResult{T}"/>。
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="result"><see cref="IResult{T}"/> 结果。</param>
    /// <returns></returns>
    /// <remarks>
    /// 对于 <see cref="IResult{T}.Value"/> 值，若为 <see cref="bool"/> 类型会转化为为对应的 "SuccessCode" 或 "BadCode" 值状态码；
    /// 若为 <see cref="Enum"/> 类型会转化为 <see cref="int"/> 值状态码；其他默认转换为 "SuccessCode" 值状态码。
    /// </remarks>
    public static IApiResult<T> ToApiResult<T>(this IResult<T> result)
    {
        // bool和枚举类型值会影响对应的状态码。
        int code = result.Value switch
        {
            bool ok => ok ? ApiResult.SuccessCode : ApiResult.BadCode,
            Enum @enum => Convert.ToInt32(@enum), // Int32 枚举类型
            _ => ApiResult.SuccessCode,
        };

        return new ApiResult<T>()
        {
            Code = code,
            Message = result.Message ?? string.Empty,
            Data = result.Value,
        };
    }
}
